from flask import Flask, render_template, session, redirect, url_for, flash
from flask.ext.moment import Moment
from flask.ext.bootstrap import Bootstrap
from datetime import datetime
from flask.ext.wtf import Form
import os
from wtforms import StringField, SubmitField
from wtforms.validators import Required
from flask.ext.sqlalchemy import SQLAlchemy

# Flask使用构造函数传递的参数觉得程序的根目录，
# 以便找到程序根目录的资源文件位置
app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SECRET_KEY'] = 'hard to guess string'
app.config['SQLALCHEMY_DATABASE_URL'] = 'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
db = SQLAlchemy(app)
bootstrap = Bootstrap(app)
moment = Moment(app)


class Role(db.Model):
    __tablename__ = "roles"
    user=db.relationship('User',backref='role')
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)

    def __repr__(self):
        return '<Role %r>' % self.name


class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

    def __repr__(self):
        return '<User %r>' % self.username


class NameForm(Form):
    name = StringField("what is your name?", validators=[Required()])
    submit = SubmitField('Submit')


# 视图函数
# @app.route('/')
# def index():
#     return render_template('index.html',
#                            current_time=datetime.utcnow())
@app.route('/', methods=['GET', 'POST'])
def index():
    form = NameForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.name.data).first()
        if user is None:
            user = User(username = form.name.data)
            db.session.add(user)
            session['known'] = False
        else:
            session['known'] = True
        session['name'] = form.name.data
        form.name.data = ''
        return redirect(url_for('index'))
    return render_template('index.html',
        form = form, name = session.get('name'),
        known = session.get('known', False))

# @app.route('/signin', methods=['GET', 'POST'])
# def sign_in():
#     name = None
#     form = NameForm()
#     if form.validate_on_submit():
#         name=form.name.data
#         name = form.name.data
#         form.name.data = ''
#     return render_template('signin.html', form=form, name=name)

# 重定向加Session例子

@app.route('/signin', methods=['GET', 'POST'])
def sign_in():
    form = NameForm()
    if form.validate_on_submit():
        # user=User.query.filter_by(username=form.name.data).first()
        old_name = session.get('name')
        if old_name is not None and old_name != form.name.data:
            flash('Looks like you have changed your name')
        session['name'] = form.name.data
        return redirect(url_for('sign_in'))
    return render_template('signin.html', form=form, name=session.get('name'))


@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404


@app.errorhandler(500)
def internal_server_error(e):
    render_template('500.html'), 500


@app.route("/user/<name>")
def user(name):
    return render_template('user.html', name=name)


# 使用run函数启动程序
if __name__ == '__main__':
    app.run(debug=True)
